@时光机
2年前 提问
1个回答

aes 加密算法 java

齐士忠
2年前

java下aes加密算法流程如下:

  1. AES的加密流程首先AES加密会把明文按128位16个字节,切成一段一段的数据,如果数据的最后一段不够16个字节,会用Padding来填充。

  2. 然后把明文块0与初始向量IV做异或操作,再用密钥加密,得到密文块0,同时密文块0也会被用作明文块1的加密向量。

  3. 然后明文块1与密文块0进行异或操作,再用密钥加密,得到密文块1。当然这里只是假设数据只有两段,如果数据不止两段,依次类推,就可以得到很多段密文块。

  4. 最后把密文块拼接起来就能得到最终的密文。

实例如下:

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.Arrays;

import java.util.Base64;

import javax.crypto.Cipher;

import javax.crypto.spec.SecretKeySpec;

public class AES {

    private static SecretKeySpec secretKey;

    private static byte[] key;

    public static void setKey(String myKey)

    {

        MessageDigest sha = null;

        try {

            key = myKey.getBytes("UTF-8");

            sha = MessageDigest.getInstance("SHA-1");

            key = sha.digest(key);

            key = Arrays.copyOf(key, 16);

            secretKey = new SecretKeySpec(key, "AES");

        }

        catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        }

        catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        }

    }


    public static String encrypt(String strToEncrypt, String secret)

    {

        try

        {

            setKey(secret);

            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

            cipher.init(Cipher.ENCRYPT_MODE, secretKey);

            return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));

        }

        catch (Exception e)

        {

            System.out.println("Error while encrypting: " + e.toString());

        }

        return null;

    }

    public static String decrypt(String strToDecrypt, String secret)

    {

        try

        {

            setKey(secret);

            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");

            cipher.init(Cipher.DECRYPT_MODE, secretKey);

            return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));

        }

        catch (Exception e)

        {

            System.out.println("Error while decrypting: " + e.toString());

        }

        return null;

    }

}